﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MREO.data;
using System.Data.SqlServerCe;

namespace MREO.gui
{
    public partial class fUsers_AddEdit : Form
    {
        public Users oUser = null;

        Connection Conn = new Connection();
        SqlCeDataAdapter adapter = new SqlCeDataAdapter();
        SqlCeCommand command = null;

        public fUsers_AddEdit()
        {
            InitializeComponent();
        }

        private void button_save_Click(object sender, EventArgs e)
        {
            if (oUser == null)  // если создание нового пользователя - создаем новый объект
                oUser = new Users();

            string errMsg = "Незаполнены следующие обязательные поля:";
            
            oUser._fam = textBox_fam.Text.Trim();
            oUser._im = textBox_im.Text.Trim();
            oUser._otch = textBox_otch.Text.Trim();
            oUser._lvl = comboBox_lvl.SelectedIndex;
            oUser._pwd = textBox_pwd.Text;

            if(oUser._fam.Length == 0) errMsg += "\n - Фамилия";
            if (oUser._im.Length == 0) errMsg += "\n - Имя";
            if (oUser._otch.Length == 0) errMsg += "\n - Отчество";
            if (oUser._lvl == -1) errMsg += "\n - Уровень доступа";
            if (oUser._pwd.Length == 0) errMsg += "\n - Пароль";

            if (!errMsg.Equals("Незаполнены следующие обязательные поля:"))
            {
                MessageBox.Show(errMsg);
                return;
            }

            if (oUser._id == 0)  // Новый пользователь
                try { addUser(oUser); }
                catch (Exception exc) { MessageBox.Show("Не удалось создать новую учетную запись \n\n" + exc.Message); return; }
            else                // Редактирование пользователя
                try { updateUser(oUser); }
                catch (Exception exc) { MessageBox.Show("Не удалось сохранить учетную запись \n\n" + exc.Message); return; }

            MessageBox.Show("Данные сохранены.");
            DialogResult = DialogResult.OK;
            Close();
        }

        private void updateUser(Users oUser)
        {
            try
            {
                Conn.con.Open();

                command = new SqlCeCommand("UPDATE users SET fam = @fam, im = @im, otch = @otch, lvl = @lvl, pwd = @pwd " +
                                            " WHERE id = @id"
                                            , Conn.con);
                command.Parameters.Add("@id", SqlDbType.Int).Value = oUser._id;
                command.Parameters.Add("@fam", SqlDbType.NVarChar).Value = oUser._fam;
                command.Parameters.Add("@im", SqlDbType.NVarChar).Value = oUser._im;
                command.Parameters.Add("@otch", SqlDbType.NVarChar).Value = oUser._otch;
                command.Parameters.Add("@lvl", SqlDbType.Int).Value = oUser._lvl;
                command.Parameters.Add("@pwd", SqlDbType.NVarChar).Value = oUser._pwd;

                command.ExecuteNonQuery();
            }
            catch (Exception exc) { throw new Exception(exc.Message); }
            finally
            {
                command.Dispose();
                adapter.Dispose();
                if (Conn.con.State == ConnectionState.Open)
                    Conn.con.Close();
            }
        }

        private void addUser(Users oUser)
        {

            try
            {
                Conn.con.Open();

                command = new SqlCeCommand("INSERT INTO users(fam, im, otch, lvl, pwd) " +
                                            " VALUES (@fam, @im, @otch, @lvl, @pwd)"
                                            , Conn.con);
                command.Parameters.Add("@fam", SqlDbType.NVarChar).Value = oUser._fam;
                command.Parameters.Add("@im", SqlDbType.NVarChar).Value = oUser._im;
                command.Parameters.Add("@otch", SqlDbType.NVarChar).Value = oUser._otch;
                command.Parameters.Add("@lvl", SqlDbType.Int).Value = oUser._lvl;
                command.Parameters.Add("@pwd", SqlDbType.NVarChar).Value = oUser._pwd;

                command.ExecuteNonQuery();
            }
            catch (Exception exc) { throw new Exception(exc.Message); }
            finally
            {
                command.Dispose();
                adapter.Dispose();
                if (Conn.con.State == ConnectionState.Open)
                    Conn.con.Close();
            }
        }

        private void fUsers_AddEdit_Shown(object sender, EventArgs e)
        {
            if (oUser == null) return;

            textBox_fam.Text = oUser._fam;
            textBox_im.Text = oUser._im;
            textBox_otch.Text = oUser._otch;
            comboBox_lvl.SelectedIndex = oUser._lvl;
            textBox_pwd.Text = oUser._pwd;
        }
    }       
}           
